package com.sky.youxue.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sky.youxue.common.enums.ExceptionEnum;
import com.sky.youxue.common.exception.youxueException;
import com.sky.youxue.common.vo.PageResult;
import com.sky.youxue.mapper.SpuMapper;
import com.sky.youxue.production.bo.SpuBo;
import com.sky.youxue.production.pojo.Category;
import com.sky.youxue.production.pojo.Spu;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import tk.mybatis.mapper.entity.Example;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class SpuService {

    @Autowired
    private SpuMapper spuMapper;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private BrandService brandService;

    public PageResult<SpuBo> querySpuByPage(int page, int rows, String key, Boolean sa) {
//        //分页查询查得数据
//        PageHelper.startPage(page, Math.min(rows,100));
//        //将条件加入sql语句
//        Example example = new Example(Spu.class);
//        Example.Criteria criteria = example.createCriteria();
//
//
//        // 是否过滤上下架
//        int saleable = 0;
//        if (sa != null) {
//            if(sa==true) {
//                saleable = 1;
//            }else {
//                saleable = 0;
//            }
//            criteria.andEqualTo("saleable", saleable);
//        }
//
//        // 是否模糊查询
//        if (!StringUtils.isBlank(key)) {
//            criteria.andLike("title", "%" + key + "%");
//        }
//        //默认排序
//      //  example.setOrderByClause("last_update_time DESC");
//
//        //查询
//        Page<Spu> pageInfo = (Page<Spu>) spuMapper.selectByExample(example);
//        //封装在spubo中
//        System.out.println("********************************");
//
//        //获取所有的spu的集合
//        List<Spu> spus = pageInfo.getResult();
////        System.out.println(spus);
//
//        //新建一个spuBos的集合，来接收返回的数据
//        List<SpuBo> spuBos = new ArrayList<>();
//        //遍历spu，查询cname
//        for (Spu spu : spus) {
//            //新建一个集合，来接受cid的集合
//            SpuBo spuBo = new SpuBo();
//            //查询cname
//           /* ArrayList<Long> cids = new ArrayList<>();
//            cids.add(spu.getCid1());
//            cids.add(spu.getCid2());
//            cids.add(spu.getCid3());*/
//           /*可以简化为*/
//
//            List<String> list = categoryService.queryCategoryNameByCids(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()));
//            //将list拼接成字符串
//           // System.out.println(list);
//            String categoryName = StringUtils.join(list, "/");
//            //查询bname
//            String brandName = brandService.queryBrandNameByBid(spu.getBrandId());
////            System.out.println("-----------------------------");
////            System.out.println(brandName);
////            System.out.println(categoryName);
//            //封装bname，cname
//            spuBo.setCname(categoryName);
//            spuBo.setBname(brandName);
//            System.out.println("////////////////////////////////");
//            System.out.println(spuBo);
//
//            spuBos.add(spuBo);
//
//           BeanUtils.copyProperties(spu,spuBo);
//            //将这个对象添加到集合中
//
//        }
//
//        System.out.println(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;");
//        System.out.println(spuBos);
//        //根据cid的集合去查询cname，格式是../../../
//        /*根据bid去查询bname*/
//
//        PageResult<SpuBo> pageResult = new PageResult<>(pageInfo.getTotal(),spuBos);
////        pageResult.setTotal(pageInfo.getTotal());
////        pageResult.setItems(spuBos);
//        System.out.println("+++++++++++++++++++++++");
//        System.out.println(pageResult);
//        return pageResult;

        // 1、查询SPU
        // 分页,最多允许查100条
        PageHelper.startPage(page, Math.min(rows, 100));

        // 创建查询条件
        Example example = new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();

        // 是否过滤上下架
        int saleable = 0;
        if (sa != null) {
            if(sa==true) {
                saleable = 1;
            }else {
                saleable = 0;
            }
            System.out.println(saleable);
            criteria.andEqualTo("saleable", saleable);
        }

        // 是否模糊查询
        if (StringUtils.isNotBlank(key)) {
            criteria.andLike("title", "%" + key + "%");
        }
        // 默认排序
        example.setOrderByClause("last_update_time ASC");

        // 查询
        List<Spu> spus = spuMapper.selectByExample(example);
        //System.out.println(spus);

        // 判断
        if (CollectionUtils.isEmpty(spus)) {
            throw new youxueException(ExceptionEnum.INVALID_FILE_TYPE);
        }

        // 解析分类和
        loadCategoryAndBrandName(spus);

        // 解析分页的结果
        PageInfo<Spu> info = new PageInfo<>(spus);
        return new PageResult(info.getTotal(), spus);
    }
    private void loadCategoryAndBrandName(List<Spu> spus) {
        for (Spu spu : spus) {
            // 处理分类名称
            List<String> names = categoryService.queryByIds(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()))
                    .stream().map(Category::getName).collect(Collectors.toList());
            spu.setCname(StringUtils.join(names, "/"));
            // 处理品牌名称
            spu.setBname(brandService.queryById(spu.getBrandId()).getName());
        }
    }

    public Spu querySpuBySpuId(Long id) {
        Spu spu = this.spuMapper.selectByPrimaryKey(id);
        return spu;
    }
}
